#include <iostream>
using namespace std;
//在继承的前提下，拷贝构造函数，赋值运算符函数怎么书写
//基类对象和派生类对象的内存是独立的，所以构造时候和析构的时候，是互不影响的
//但是！！！！因为三合成原则的关系，必须在派生类的拷贝，赋值运算符函数中显示的写出对于
//基类的这些函数的调用，拷贝函数在初始化列表中显示写出，赋值运算符函数在函数体内写出
class A{
public:
    A(const int a)
    :_a(a)
    {

    }
    
    A(const A &  rhs)
    :_a(rhs._a) 
    {

    }
    //赋值运算符函数
    A &operator=(const A & rhs){
        if(this!=&rhs){
            _a=rhs._a;
        }
        return *this;
    }
    void print(){
        cout<<_a<<endl;
    }
int _a;
};
class B:public A{
public:
    B(int a,int b)
    :A(a)
    , _b(b)
    {

    }
    B(const B& rhs)
    :A(rhs._a)
    ,_b(rhs._b)
    {

    }
    //赋值运算符函数
    B & operator=(const B & rhs){
        if(this!=&rhs){
            A::operator=(rhs);
            _b=rhs._b;
        }
        //显示调用赋值运算符函数,否则会有一半赋值失败
        return *this;
    }
    void print2(){
        cout<<_a<<_b<<endl;
    }
private:
int _b;
};


void test(){
    A a(1);
    B b(2,3);
    a.print();
    b.print2();
    //手动调用B的拷贝构造函数  
    B b2=b;
    b2.print2();
    //执行B赋值运算符函数的操作
    B b3(4,5);
    b3=b2;
    b3.print2();

}
int main(int argc, char * argv[]){
    test();    
    return 0;
}

